// ES6 允许为函数的参数设置默认值，即直接写在参数定义的后面。
// 参数变量是默认声明的，所以不能用let或const再次声明。
function log(x, y = 'World') {
    console.log(x, y);
}

log('Hello') // Hello World
log('Hello', 'China') // Hello China
log('Hello', '') // Hello



// 作用域:一旦设置了参数的默认值，函数进行声明初始化时，参数会形成一个单独的作用域（context）。
// 等到初始化结束，这个作用域就会消失。这种语法行为，在不设置参数默认值时，是不会出现的。

const xx =1;
function f11(xx, y=xx) {    // 函数f11调用时，参数y = xx形成一个单独的作用域。
    console.log(y);         // 这个作用域里面，变量xx本身没有定义，所以指向外层的全局变量xx。
}
f11(22);                // 函数调用时，函数体内部的局部变量xx影响不到默认值变量x。




const zz = 181;
function fooi(zz, yy = function() { zz = 262; }) {    // 函数fooi的参数形成一个单独作用域。
    zz = 393;
    yy();
    console.log(zz);
}

fooi();              //262
console.log(zz);     //181





